"""

    并发运行任务 - wait - FIRST_EXCEPTION

"""
import asyncio
import random

import aiohttp
from async_web import async_timed, fetch_status


async def delay(seconds):
    print(f"sleep for {seconds} seconds")
    await asyncio.sleep(seconds)


@async_timed()
async def main():
    async with aiohttp.ClientSession() as session:
        fetchers = [
            asyncio.create_task(fetch_status(session, "http://www.baidu.com")),

            asyncio.create_task(fetch_status(session, "python://bad")),

            asyncio.create_task(fetch_status(session, "http://www.baidu.com")),
        ]
        done, pending = await asyncio.wait(fetchers, return_when=asyncio.FIRST_EXCEPTION)
        """
            asyncio.ALL_COMPLETED : 
                默认，挂起的集合为0，要一切都完成后才返回，
                中间遇到异常，也得等任务完成后，才会看到异常消息
                在协程成功不抛异常的情况下，必须等所有协程执行完成
            asyncio.FIRST_EXCEPTION
                中间任何任务抛出异常，wait将立即返回。
                在协程成功不抛异常的情况下，必须等所有协程执行完成
            asyncio.FIRST_COMPLETED
                协程至少有一个结果时，立即返回，可以是失败的协程，也可以是成功的协程
                然后可以取消其他正在运行的协程
                
        """

        print(f"完成的数量:{len(done)}")
        print(f"等待的数量:{len(pending)}")

        for done_task in done:
            if done_task.exception() is None:
                print("任务结果：", done_task.result())
            else:
                print("error:", done_task.exception())

        for pending_task in pending:
            print("结束任务")
            pending_task.cancel()


asyncio.run(main())
